<?php

/**
 * This file is part of the Latte (https://latte.nette.org)
 * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
 */

declare(strict_types=1);

namespace Latte\Compiler;

use Latte\Compiler\Nodes\Php as Node;
use Latte\Compiler\Nodes\Php\Expression;
use Latte\Compiler\Nodes\Php\Scalar;
use function array_pop, count, is_string, substr;


/** @internal generated part of TagParser */
trait TagParserData
{
	/** Symbol number of error recovery token */
	protected const ErrorSymbol = 1;

	/** Action number signifying default action */
	protected const DefaultAction = -8190;

	/** Rule number signifying that an unexpected token was encountered */
	protected const UnexpectedTokenRule = 8191;

	protected const Yy2Tblstate = 268;

	/** Number of non-leaf states */
	protected const NumNonLeafStates = 363;

	/** Map of lexer tokens to internal symbols */
	protected const TokenToSymbol = [
		0,     116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   51,    111,   116,   112,   50,    116,   116,
		105,   106,   48,    46,    2,     47,    42,    49,    116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   22,    109,
		37,    7,     39,    21,    62,    116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   64,    116,   110,   29,    116,   116,   103,   116,   116,
		116,   101,   104,   116,   116,   116,   116,   116,   116,   102,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   107,   26,    108,   53,    116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
		116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   1,     3,     4,     5,
		6,     8,     9,     10,    11,    12,    13,    14,    15,    16,    17,    18,    19,    20,    23,    24,    25,    27,    28,    30,
		31,    32,    33,    34,    35,    36,    38,    40,    41,    43,    44,    45,    52,    54,    55,    56,    57,    58,    59,    60,
		61,    63,    65,    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
		83,    84,    85,    86,    87,    88,    89,    90,    91,    92,    93,    113,   94,    95,    96,    97,    114,   115,   98,    99,
		100,
	];

	/** Map of states to a displacement into the self::Action table. The corresponding action for this
	 *  state/symbol pair is self::Action[self::ActionBase[$state] + $symbol]. If self::ActionBase[$state] is 0, the
	 *  action is defaulted, i.e. self::ActionDefault[$state] should be used instead. */
	protected const ActionBase = [
		214,   317,   317,   317,   317,   102,   145,   317,   274,   188,   231,   317,   400,   400,   400,   293,   293,   293,   293,   298,
		298,   302,   324,   391,   392,   394,   395,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,
		-46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,
		-46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,
		-46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,
		-46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   131,   232,   246,   417,   422,   419,   425,   450,   453,   449,
		466,   477,   52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    192,   252,   152,   327,
		327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   327,   355,   355,   355,
		269,   560,   530,   140,   406,   433,   433,   481,   481,   481,   481,   481,   105,   58,    58,    161,   161,   161,   161,   457,
		457,   455,   455,   455,   455,   455,   455,   455,   455,   455,   243,   365,   13,    13,    88,    18,    -41,   -41,   -41,   -41,
		109,   109,   109,   109,   109,   109,   109,   486,   195,   195,   195,   67,    280,   454,   509,   289,   177,   177,   177,   177,
		177,   177,   291,   467,   512,   522,   522,   525,   295,   295,   522,   301,   158,   40,    73,    -40,   -16,   306,   334,   333,
		2,     397,   284,   305,   300,   36,    36,    403,   95,    293,   476,   476,   271,   293,   293,   293,   271,   57,    57,    57,
		-65,   -33,   74,    239,   430,   239,   239,   239,   254,   107,   344,   345,   47,    346,   346,   115,   65,    348,   350,   346,
		346,   160,   65,    65,    297,   290,   341,   187,   77,    341,   299,   299,   168,   27,    363,   362,   367,   343,   342,   435,
		213,   253,   296,   294,   337,   273,   363,   362,   367,   316,   3,     329,   330,   286,   286,   286,   286,   286,   286,   286,
		286,   286,   286,   213,   292,   33,    308,   368,   369,   6,     383,   387,   321,   303,   429,   286,   339,   328,   322,   465,
		336,   17,    213,   470,   434,   326,   245,   340,   304,   472,   389,   323,   440,   207,   370,   223,   441,   225,   439,   256,
		390,   468,   444,   0,     -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,
		-46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   -46,   0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     52,    52,    52,    52,    52,    52,    52,
		52,    52,    52,    52,    52,    0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     52,
		52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,
		52,    52,    52,    52,    52,    52,    52,    0,     52,    52,    52,    52,    52,    52,    52,    58,    0,     0,     195,   195,
		195,   195,   532,   532,   532,   532,   532,   532,   532,   532,   532,   532,   532,   195,   195,   532,   532,   532,   532,   532,
		532,   532,   532,   532,   532,   532,   532,   532,   532,   532,   0,     0,     0,     0,     0,     0,     0,     0,     158,   299,
		299,   299,   299,   299,   299,   158,   158,   0,     0,     0,     0,     195,   195,   0,     0,     0,     158,   299,   0,     0,
		0,     0,     0,     0,     293,   293,   293,   158,   346,   346,   271,   0,     0,     299,   299,   0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     286,   33,    286,   286,   286,
	];

	/** Table of actions. Indexed according to self::ActionBase comment. */
	protected const Action = [
		33,    34,    -279,  -50,   -279,  35,    -48,   36,    181,   182,   37,    38,    39,    40,    41,    42,    43,    -47,   1,     196,
		44,    574,   575,   211,   -231,  556,   390,   0,     -192,  572,   294,   390,   253,   254,   200,   7,     295,   296,   12,    200,
		-192,  297,   298,   215,   -231,  -231,  -231,  -8190, 29,    11,    558,   557,   580,   578,   579,   53,    54,    55,    13,    28,
		-191,  371,   372,   370,   49,    232,   299,   14,    216,   217,   218,   299,   -191,  22,    -47,   56,    57,    58,    59,    20,
		180,   60,    61,    62,    63,    64,    65,    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
		79,    80,    81,    381,   199,   371,   372,   370,   -279,  200,   375,   427,   -279,  426,   -8190, 82,    427,   102,   426,   -52,
		348,   201,   202,   374,   373,   203,   388,   385,   389,   386,   583,   -232,  369,   368,   378,   377,   380,   379,   376,   382,
		383,   384,   660,   -8190, -8190, -8190, 661,   381,   371,   372,   370,   -232,  -232,  -232,  375,   -8190, -8190, -8190, 173,   174,
		-191,  -8190, 194,   -8190, -8190, -8190, -8190, 197,   45,    -8190, 241,   207,   -191,  305,   104,   369,   368,   390,   306,   377,
		242,   243,   376,   382,   307,   308,   427,   31,    426,   392,   381,   371,   372,   370,   -29,   -8190, 23,    375,   -8191, -8191,
		-8191, -8191, 72,    73,    74,    75,    76,    427,   438,   426,   197,   45,    99,    106,   207,   536,   305,   299,   369,   368,
		96,    306,   377,   242,   243,   376,   382,   307,   308,   107,   390,   108,   649,   381,   371,   372,   370,   214,   16,    24,
		375,   77,    78,    79,    80,    81,    388,   199,   389,   21,    185,   438,   18,    197,   45,    -8190, -8190, 207,   82,    305,
		97,    369,   368,   109,   306,   377,   242,   243,   376,   382,   307,   308,   -8190, -8190, -8190, 206,   381,   371,   372,   370,
		204,   205,   25,    375,   100,   73,    74,    75,    76,    299,   -8190, 199,   -8190, -8190, 438,   -23,   197,   45,    173,   174,
		207,   -80,   305,   -80,   369,   368,   -17,   306,   377,   242,   243,   376,   382,   307,   308,   32,    252,   3,     179,   381,
		371,   372,   370,   369,   368,   26,    375,   -16,   -80,   -80,   -8190, -8190, -8190, -277,  -275,  -277,  -275,  438,   17,    197,
		45,    -8190, -8190, 207,   -229,  305,   98,    369,   368,   82,    306,   377,   242,   243,   376,   382,   307,   308,   -8190, -8190,
		-8190, 105,   381,   195,   -229,  -229,  -229,  103,   101,   375,   234,   390,   332,   -229,  -8190, 287,   -8190, 662,   354,   584,
		438,   585,   197,   45,    400,   -236,  207,   -200,  305,   172,   257,   258,   259,   306,   377,   242,   243,   376,   382,   307,
		308,   250,   569,   371,   372,   370,   0,     -80,   74,    75,    76,    46,    47,    15,    83,    84,    85,    86,    87,    88,
		89,    90,    91,    92,    93,    94,    95,    -262,  -261,  657,   369,   368,   284,   -260,  -236,  -235,  -8190, -8190, -8190, -277,
		-275,  -234,  -233,  -277,  -275,  381,   286,   2,     4,     5,     6,     8,     375,   9,     -8190, 10,    -8190, -8190, -8190, -8190,
		480,   482,   -8190, -8190, -8190, 197,   45,    27,    50,    207,   -225,  305,   51,    192,   193,   249,   306,   377,   242,   243,
		376,   382,   307,   308,   -8190, -8190, -8190, 369,   368,   524,   -225,  -225,  -225,  570,   101,   439,   542,   548,   550,   -225,
		552,   604,   -8190, -29,   -8190, -8190, -8190, -8190, -22,   519,   -8190, -8190, -8190, -8191, -8191, -8191, -8191, -8191, -227,  1,
		198,   1,     198,   340,   261,   344,   261,   390,   561,   390,   572,   525,   572,   -8190, -8190, -8190, 629,   659,   -227,  -227,
		-227,  19,    52,    298,   297,   298,   269,   -227,  401,   658,   -232,  -8190, 535,   -8190, -8190, -8190, -8190, 351,   656,   -235,
		48,    613,   48,    -8190, -8190, -8190, 232,   299,   232,   299,   -232,  -232,  -232,  -226,  627,   601,   -228,  362,   573,   -191,
		617,   -8190, 652,   -8190, -8190, -8190, -225,  356,   299,   30,    0,     -191,  0,     -226,  -226,  -226,  -228,  -228,  -228,  0,
		0,     554,   -226,  556,   0,     -228,  -225,  -225,  -225,  219,   220,   221,   0,     0,     -234,  -225,  0,     0,     251,   0,
		425,   0,     0,     0,     0,     0,     0,     0,     558,   557,
	];

	/** Table indexed analogously to self::Action. If self::ActionCheck[self::ActionBase[$state] + $symbol] != $symbol
	 *  then the action is defaulted, i.e. self::ActionDefault[$state] should be used instead. */
	protected const ActionCheck = [
		46,    47,    0,     0,     2,     51,    0,     53,    54,    55,    56,    57,    58,    59,    60,    61,    62,    0,     64,    65,
		66,    67,    68,    69,    64,    71,    72,    0,     93,    75,    76,    72,    78,    79,    21,    2,     82,    83,    2,     21,
		105,   87,    88,    89,    84,    85,    86,    88,    64,    2,     96,    97,    98,    99,    100,   3,     4,     5,     22,    105,
		93,    3,     4,     5,     105,   111,   112,   2,     84,    85,    86,    112,   105,   21,    0,     23,    24,    25,    26,    2,
		6,     29,    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
		48,    49,    50,    45,    52,    3,     4,     5,     106,   21,    52,    98,    110,   100,   74,    63,    98,    2,     100,   106,
		47,    26,    27,    65,    66,    30,    69,    69,    71,    71,    90,    64,    30,    31,    76,    77,    78,    79,    80,    81,
		82,    83,    69,    3,     4,     5,     73,    45,    3,     4,     5,     84,    85,    86,    52,    3,     4,     5,     27,    28,
		93,    21,    2,     23,    24,    25,    26,    65,    66,    29,    2,     69,    105,   71,    22,    30,    31,    72,    76,    77,
		78,    79,    80,    81,    82,    83,    98,    80,    100,   2,     45,    3,     4,     5,     106,   3,     94,    52,    37,    38,
		39,    40,    41,    42,    43,    44,    45,    98,    106,   100,   65,    66,    107,   6,     69,    108,   71,    112,   30,    31,
		7,     76,    77,    78,    79,    80,    81,    82,    83,    6,     72,    6,     74,    45,    3,     4,     5,     106,   6,     94,
		52,    46,    47,    48,    49,    50,    69,    52,    71,    91,    92,    106,   6,     65,    66,    3,     4,     69,    63,    71,
		7,     30,    31,    7,     76,    77,    78,    79,    80,    81,    82,    83,    3,     4,     5,     30,    45,    3,     4,     5,
		26,    27,    94,    52,    107,   42,    43,    44,    45,    112,   21,    52,    23,    24,    106,   22,    65,    66,    27,    28,
		69,    0,     71,    2,     30,    31,    22,    76,    77,    78,    79,    80,    81,    82,    83,    101,   102,   103,   104,   45,
		3,     4,     5,     30,    31,    94,    52,    22,    27,    28,    3,     4,     5,     0,     0,     2,     2,     106,   22,    65,
		66,    46,    47,    69,    64,    71,    22,    30,    31,    63,    76,    77,    78,    79,    80,    81,    82,    83,    3,     4,
		5,     22,    45,    22,    84,    85,    86,    64,    94,    52,    64,    72,    70,    93,    74,    77,    21,    73,    81,    90,
		106,   90,    65,    66,    94,    105,   69,    93,    71,    93,    84,    85,    86,    76,    77,    78,    79,    80,    81,    82,
		83,    93,    110,   3,     4,     5,     -1,    106,   43,    44,    45,    94,    95,    7,     8,     9,     10,    11,    12,    13,
		14,    15,    16,    17,    18,    19,    20,    105,   105,   108,   30,    31,    106,   105,   105,   105,   3,     4,     5,     106,
		106,   105,   105,   110,   110,   45,    106,   105,   105,   105,   105,   105,   52,    105,   21,    105,   23,    24,    25,    26,
		54,    55,    29,    30,    31,    65,    66,    105,   105,   69,    64,    71,    105,   105,   105,   105,   76,    77,    78,    79,
		80,    81,    82,    83,    3,     4,     5,     30,    31,    106,   84,    85,    86,    106,   94,    106,   106,   106,   106,   93,
		106,   106,   21,    106,   23,    24,    25,    26,    22,    106,   29,    30,    31,    32,    33,    34,    35,    36,    64,    64,
		65,    64,    65,    106,   69,    106,   69,    72,    106,   72,    75,    106,   75,    3,     4,     5,     106,   108,   84,    85,
		86,    107,   107,   88,    87,    88,    107,   93,    108,   108,   64,    21,    108,   23,    24,    25,    26,    108,   108,   105,
		105,   108,   105,   3,     4,     5,     111,   112,   111,   112,   84,    85,    86,    64,    108,   110,   64,    109,   111,   93,
		110,   21,    110,   23,    24,    25,    64,    110,   112,   64,    -1,    105,   -1,    84,    85,    86,    84,    85,    86,    -1,
		-1,    69,    93,    71,    -1,    93,    84,    85,    86,    84,    85,    86,    -1,    -1,    105,   93,    -1,    -1,    93,    -1,
		88,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    96,    97,
	];

	/** Map of states to their default action */
	protected const ActionDefault = [
		8191,  273,   273,   31,    273,   8191,  8191,  273,   8191,  8191,  8191,  29,    8191,  8191,  29,    8191,  8191,  8191,  8191,  39,
		29,    8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  223,   223,   223,   8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,
		8191,  8191,  8191,  8191,  8191,  10,    8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,
		8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,
		8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,
		8191,  8191,  29,    8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  274,   274,   8191,  8191,  8191,  8191,  8191,  8191,  8191,
		8191,  8191,  1,     280,   281,   85,    79,    224,   276,   278,   81,    84,    82,    43,    44,    56,    123,   125,   159,   124,
		99,    104,   105,   106,   107,   108,   109,   110,   111,   112,   113,   114,   115,   116,   97,    98,    171,   160,   158,   157,
		121,   122,   126,   129,   96,    127,   128,   146,   147,   144,   145,   148,   8191,  8191,  8191,  149,   150,   151,   152,   8191,
		8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  153,   130,   71,    71,    71,    8191,  8191,  11,    8191,  8191,
		8191,  8191,  8191,  8191,  8191,  8191,  8191,  214,   136,   137,   139,   214,   176,   213,   155,   8191,  8191,  8191,  8191,  8191,
		8191,  8191,  8191,  8191,  219,   118,   120,   197,   131,   132,   100,   225,   8191,  8191,  8191,  218,   8191,  288,   225,   225,
		225,   34,    34,    34,    8191,  92,    92,    8191,  57,    34,    8191,  8191,  8191,  34,    34,    34,    2,     8191,  8191,  8191,
		203,   232,   225,   142,   8191,  133,   134,   135,   59,    8191,  190,   8191,  28,    175,   8191,  28,    28,    8191,  246,   247,
		248,   28,    28,    28,    178,   36,    73,    28,    28,    73,    8191,  8191,  28,    8191,  8191,  8191,  8191,  8191,  8191,  8191,
		8191,  208,   8191,  230,   244,   193,   15,    20,    21,    8191,  208,   229,   227,   140,   141,   143,   163,   164,   165,   166,
		167,   168,   169,   271,   8191,  267,   196,   8191,  8191,  225,   8191,  8191,  287,   8191,  225,   138,   8191,  204,   251,   8191,
		226,   225,   272,   8191,  8191,  8191,  60,    8191,  8191,  8191,  8191,  205,   8191,  8191,  8191,  8191,  8191,  8191,  8191,  55,
		8191,  8191,  8191,
	];

	/** Map of non-terminals to a displacement into the self::Goto table. The corresponding goto state for this
	 *  non-terminal/state pair is self::Goto[self::GotoBase[$nonTerminal] + $state] (unless defaulted) */
	protected const GotoBase = [
		0,     0,     -1,    0,     0,     0,     108,   0,     247,   -141,  37,    -20,   0,     110,   61,    0,     0,     0,     0,     102,
		169,   54,    -21,   288,   -10,   60,    0,     72,    0,     78,    96,    0,     0,     -65,   -3,    5,     -5,    166,   0,     0,
		-243,  34,    0,     66,    0,     0,     -19,   6,     0,     0,     0,     56,    0,     0,     0,     0,     1,     -50,   0,     0,
		0,     28,    39,    3,     58,    45,    42,    0,     0,     -15,   12,    0,     43,    116,   107,   76,    0,     0,
	];

	/** Table of states to goto after reduction. Indexed according to self::GotoBase comment. */
	protected const Goto = [
		112,   112,   111,   112,   450,   331,   112,   282,   283,   451,   111,   343,   361,   452,   140,   128,   129,   128,   125,   125,
		117,   138,   130,   130,   130,   130,   125,   110,   127,   127,   127,   122,   313,   314,   263,   315,   316,   317,   318,   319,
		320,   321,   322,   466,   466,   123,   124,   113,   114,   115,   116,   118,   136,   137,   139,   157,   160,   161,   162,   163,
		165,   166,   167,   168,   169,   170,   171,   175,   176,   177,   178,   190,   191,   208,   209,   210,   228,   229,   265,   266,
		267,   335,   141,   142,   143,   144,   145,   146,   147,   148,   149,   150,   151,   152,   153,   154,   155,   158,   119,   120,
		130,   131,   121,   159,   132,   133,   156,   134,   135,   183,   183,   183,   183,   395,   631,   183,   653,   654,   655,   183,
		264,   396,   405,   186,   188,   189,   188,   424,   424,   424,   424,   553,   553,   553,   553,   424,   424,   424,   424,   424,
		424,   424,   555,   555,   555,   555,   555,   555,   555,   555,   555,   555,   555,   555,   555,   555,   555,   338,   262,   341,
		225,   226,   238,   329,   334,   230,   231,   239,   240,   310,   310,   571,   571,   571,   571,   571,   571,   571,   571,   571,
		441,   616,   616,   616,   616,   311,   311,   311,   311,   311,   311,   311,   311,   311,   311,   311,   330,   326,   326,   326,
		326,   628,   628,   628,   628,   628,   628,   594,   594,   594,   594,   594,   594,   594,   594,   594,   594,   594,   591,   591,
		591,   591,   591,   591,   591,   591,   591,   591,   591,   279,   280,   618,   619,   620,   409,   614,   614,   312,   312,   312,
		312,   312,   312,   312,   312,   312,   312,   312,   309,   309,   309,   309,   237,   347,   309,   446,   350,   233,   309,   237,
		237,   414,   457,   456,   274,   517,   417,   357,   403,   237,   237,   663,   543,   437,   244,   547,   549,   223,   537,   537,
		454,   237,   551,   603,   605,   606,   358,   184,   184,   323,   323,   647,   323,   621,   622,   323,   421,   428,   430,   432,
		429,   431,   433,   327,   328,   544,   342,   0,     647,   648,   0,     0,     0,     0,     327,   328,   285,   0,     0,     0,
		648,   0,     0,     0,     0,     0,     0,     359,   546,   0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     398,   398,   398,   0,     0,     0,     0,     0,     398,   0,     0,
		0,     398,   398,   398,   0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     337,
		245,   246,   0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
		0,     0,     0,     0,     0,     0,     0,     412,   412,
	];

	/** Table indexed analogously to self::Goto. If self::GotoCheck[self::GotoBase[$nonTerminal] + $state] != $nonTerminal
	 *  then the goto state is defaulted, i.e. self::GotoDefault[$nonTerminal] should be used. */
	protected const GotoCheck = [
		2,     2,     2,     2,     40,    63,    2,     36,    36,    40,    2,     46,    46,    40,    2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     6,     6,     6,     6,     13,    74,    6,     9,     9,     9,     6,
		73,    13,    19,    6,     6,     6,     6,     33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
		33,    33,    57,    57,    57,    57,    57,    57,    57,    57,    57,    57,    57,    57,    57,    57,    57,    69,    22,    22,
		22,    22,    22,    22,    22,    22,    22,    22,    22,    24,    24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
		37,    69,    69,    69,    69,    47,    47,    47,    47,    47,    47,    47,    47,    47,    47,    47,    20,    56,    56,    56,
		56,    69,    69,    69,    69,    69,    69,    61,    61,    61,    61,    61,    61,    61,    61,    61,    61,    61,    62,    62,
		62,    62,    62,    62,    62,    62,    62,    62,    62,    70,    70,    70,    70,    70,    21,    69,    69,    64,    64,    64,
		64,    64,    64,    64,    64,    64,    64,    64,    8,     8,     8,     8,     10,    25,    8,     11,    11,    66,    8,     10,
		10,    11,    11,    11,    43,    43,    27,    11,    11,    10,    10,    10,    11,    29,    66,    35,    35,    65,    35,    35,
		41,    10,    35,    35,    35,    35,    34,    6,     6,     23,    23,    75,    23,    72,    72,    23,    30,    30,    30,    30,
		30,    30,    30,    14,    14,    51,    23,    -1,    75,    75,    -1,    -1,    -1,    -1,    14,    14,    14,    -1,    -1,    -1,
		75,    -1,    -1,    -1,    -1,    -1,    -1,    10,    10,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
		-1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    6,     6,     6,     -1,    -1,    -1,    -1,    -1,    6,     -1,    -1,
		-1,    6,     6,     6,     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
		-1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
		-1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    8,
		8,     8,     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
		-1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
		-1,    -1,    -1,    -1,    -1,    -1,    -1,    23,    23,
	];

	/** Map of non-terminals to the default state to goto after their reduction */
	protected const GotoDefault = [
		-8192, 293,   126,   256,   366,   367,   187,   387,   336,   626,   612,   393,   272,   633,   291,   290,   465,   352,   288,   404,
		353,   408,   164,   300,   301,   345,   281,   416,   255,   435,   248,   268,   346,   270,   355,   458,   276,   440,   275,   247,
		449,   453,   464,   273,   533,   289,   339,   212,   540,   360,   292,   545,   602,   271,   302,   277,   562,   260,   227,   303,
		-8192, 235,   224,   324,   213,   222,   646,   236,   304,   600,   278,   608,   615,   325,   632,   645,   333,   349,
	];

	/** Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for
	 *  determining the state to goto after reduction. */
	protected const RuleToNonTerminal = [
		0,     1,     1,     1,     1,     6,     6,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
		7,     7,     8,     8,     8,     9,     9,     10,    11,    11,    4,     4,     12,    12,    14,    14,    15,    15,    16,    17,
		17,    18,    18,    19,    19,    5,     5,     21,    21,    21,    21,    25,    25,    26,    26,    27,    27,    29,    29,    29,
		29,    30,    30,    30,    30,    31,    31,    31,    31,    32,    32,    28,    28,    34,    34,    35,    35,    36,    36,    37,
		37,    37,    37,    20,    38,    38,    39,    39,    3,     3,     40,    40,    41,    41,    41,    41,    2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
		2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     47,    48,    42,    42,    45,    45,
		49,    50,    50,    51,    52,    52,    52,    52,    52,    52,    56,    33,    33,    57,    57,    57,    43,    43,    43,    54,
		54,    60,    60,    61,    62,    62,    24,    64,    64,    64,    64,    44,    44,    44,    44,    44,    44,    44,    44,    44,
		44,    44,    44,    46,    46,    59,    59,    59,    59,    59,    67,    67,    67,    53,    53,    53,    53,    68,    68,    68,
		68,    68,    68,    68,    22,    22,    22,    22,    22,    69,    69,    72,    71,    58,    58,    58,    58,    58,    58,    58,
		55,    55,    55,    70,    70,    70,    23,    63,    73,    73,    74,    74,    74,    74,    13,    13,    13,    13,    13,    13,
		13,    13,    65,    65,    65,    65,    66,    76,    75,    75,    75,    75,    75,    75,    75,    75,    75,    77,    77,    77,
		77,
	];

	/** Map of rules to the length of their right-hand side, which is the number of elements that have to
	 *  be popped from the stack(s) on reduction. */
	protected const RuleToLength = [
		1,     2,     2,     2,     2,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
		1,     1,     1,     1,     1,     1,     1,     1,     0,     1,     2,     0,     1,     3,     0,     1,     0,     1,     7,     0,
		2,     1,     3,     3,     4,     1,     3,     1,     2,     1,     1,     2,     0,     1,     3,     4,     6,     1,     2,     1,
		1,     1,     1,     1,     1,     3,     3,     3,     3,     3,     3,     0,     1,     0,     2,     2,     4,     1,     3,     1,
		2,     2,     3,     2,     3,     1,     2,     2,     1,     2,     3,     3,     0,     3,     3,     1,     1,     3,     3,     3,
		4,     1,     1,     2,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     2,     2,     2,
		2,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
		2,     2,     2,     2,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     5,     4,     3,
		3,     4,     4,     2,     2,     2,     2,     2,     2,     2,     1,     8,     12,    9,     3,     2,     1,     1,     0,     4,
		2,     1,     3,     2,     2,     4,     2,     4,     4,     6,     1,     1,     1,     1,     1,     1,     1,     1,     3,     1,
		1,     0,     1,     1,     3,     5,     3,     4,     1,     1,     3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
		3,     2,     3,     0,     1,     1,     3,     1,     1,     1,     1,     1,     1,     1,     3,     1,     1,     1,     4,     1,
		4,     6,     4,     4,     1,     1,     3,     3,     3,     1,     4,     1,     3,     1,     4,     3,     3,     3,     3,     3,
		1,     3,     1,     1,     3,     1,     4,     1,     3,     1,     1,     1,     3,     0,     1,     2,     3,     4,     3,     4,
		2,     2,     2,     2,     1,     2,     1,     1,     1,     4,     3,     3,     3,     3,     3,     6,     3,     1,     1,     2,
		1,
	];

	/** Map of symbols to their names */
	protected const SymbolToName = [
		'end',
		'error',
		"','",
		"'or'",
		"'xor'",
		"'and'",
		"'=>'",
		"'='",
		"'+='",
		"'-='",
		"'*='",
		"'/='",
		"'.='",
		"'%='",
		"'&='",
		"'|='",
		"'^='",
		"'<<='",
		"'>>='",
		"'**='",
		"'??='",
		"'?'",
		"':'",
		"'??'",
		"'||'",
		"'&&'",
		"'|'",
		"'?|'",
		"'^'",
		"'&'",
		"'&'",
		"'=='",
		"'!='",
		"'==='",
		"'!=='",
		"'<=>'",
		"'<'",
		"'<='",
		"'>'",
		"'>='",
		"'|>'",
		"'.'",
		"'<<'",
		"'>>'",
		"'in'",
		"'+'",
		"'-'",
		"'*'",
		"'/'",
		"'%'",
		"'!'",
		"'instanceof'",
		"'~'",
		"'++'",
		"'--'",
		"'(int)'",
		"'(float'",
		"'(string)'",
		"'(array)'",
		"'(object)'",
		"'(bool)'",
		"'@'",
		"'**'",
		"'['",
		"'new'",
		"'clone'",
		'integer',
		'floating-point number',
		'identifier',
		'variable name',
		'constant',
		'variable',
		'number',
		'string content',
		'quoted string',
		"'match'",
		"'default'",
		"'function'",
		"'fn'",
		"'return'",
		"'use'",
		"'isset'",
		"'empty'",
		"'->'",
		"'?->'",
		"'??->'",
		"'list'",
		"'array'",
		"'heredoc start'",
		"'heredoc end'",
		"'\${'",
		"'{\$'",
		"'::'",
		"'...'",
		"'(expand)'",
		'fully qualified name',
		'namespaced name',
		"'null'",
		"'true'",
		"'false'",
		"'e'",
		"'m'",
		"'a'",
		"'f'",
		"'('",
		"')'",
		"'{'",
		"'}'",
		"';'",
		"']'",
		"'\"'",
		"'$'",
		"'\\\\'",
		'whitespace',
		'comment',
	];

	/** Temporary value containing the result of last semantic action (reduction) */
	protected mixed $semValue = null;

	/** Semantic value stack (contains values of tokens and semantic action results) */
	protected array $semStack;

	/** @var Token[] Start attribute stack */
	protected array $startTokenStack;


	protected function reduce(int $rule, int $pos): void
	{
		(match ($rule) {
			0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 28, 29, 57, 72, 74, 95, 96, 101, 102, 170, 176, 177, 190, 192, 196, 197, 199, 200, 202, 213, 218, 219, 224, 225, 227, 228, 229, 230, 231, 233, 235, 236, 237, 239, 244, 245, 249, 253, 260, 262, 263, 265, 270, 288, 300 => fn() => $this->semValue = $this->semStack[$pos],
			2 => fn() => $this->semValue = new Node\ModifierNode($this->semStack[$pos], position: $this->startTokenStack[$pos]->position),
			3 => fn() => $this->semValue = new Expression\ArrayNode($this->semStack[$pos], position: $this->startTokenStack[$pos]->position),
			22, 23, 24, 25, 26, 62, 63, 64 => fn() => $this->semValue = new Node\IdentifierNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			27 => fn() => $this->semValue = new Expression\VariableNode(substr($this->semStack[$pos], 1), $this->startTokenStack[$pos]->position),
			30, 40, 51, 83, 93, 94, 155, 156, 179, 180, 198, 226, 234, 261, 264, 296 => fn() => $this->semValue = $this->semStack[$pos - 1],
			31, 39, 52, 75, 92, 178, 201 => fn() => $this->semValue = [],
			32, 41, 53, 77, 85, 88, 181, 269, 284 => fn() => $this->semValue = [$this->semStack[$pos]],
			33, 42, 54, 66, 68, 70, 78, 84, 182, 268 => function () use ($pos) {
				$this->semStack[$pos - 2][] = $this->semStack[$pos];
				$this->semValue = $this->semStack[$pos - 2];
			},
			34, 36 => fn() => $this->semValue = false,
			35, 37 => fn() => $this->semValue = true,
			38 => fn() => $this->semValue = new Expression\MatchNode($this->semStack[$pos - 4], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 6]->position),
			43 => fn() => $this->semValue = new Node\MatchArmNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			44 => fn() => $this->semValue = new Node\MatchArmNode(null, $this->semStack[$pos], $this->startTokenStack[$pos - 3]->position),
			45 => fn() => $this->semValue = [null, ...$this->semStack[$pos]],
			46 => fn() => $this->semValue = [$this->semStack[$pos - 2], ...$this->semStack[$pos]],
			47, 49 => fn() => $this->semValue = [$this->semStack[$pos], false],
			48 => fn() => $this->semValue = [$this->semStack[$pos], true],
			50 => fn() => $this->semValue = [$this->convertArrayToList($this->semStack[$pos]), false],
			55 => fn() => $this->semValue = new Node\ParameterNode($this->semStack[$pos], null, $this->semStack[$pos - 3], $this->semStack[$pos - 2], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
			56 => fn() => $this->semValue = new Node\ParameterNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->semStack[$pos - 5], $this->semStack[$pos - 4], $this->semStack[$pos - 3], $this->startTokenStack[$pos - 5]->position),
			58 => fn() => $this->semValue = new Node\NullableTypeNode($this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			59 => fn() => $this->semValue = new Node\UnionTypeNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			60 => fn() => $this->semValue = new Node\IntersectionTypeNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			61 => fn() => $this->semValue = TagParser::handleBuiltinTypes($this->semStack[$pos]),
			65, 67, 69 => fn() => $this->semValue = [$this->semStack[$pos - 2], $this->semStack[$pos]],
			71, 73, 223 => fn() => $this->semValue = null,
			76 => fn() => $this->semValue = $this->semStack[$pos - 2],
			79 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], false, false, null, $this->startTokenStack[$pos]->position),
			80 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], true, false, null, $this->startTokenStack[$pos - 1]->position),
			81 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], false, true, null, $this->startTokenStack[$pos - 1]->position),
			82 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], false, false, $this->semStack[$pos - 2], $this->startTokenStack[$pos - 2]->position),
			86, 87 => fn() => $this->semValue = new Expression\FilterCallNode($this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			89, 282, 283 => function () use ($pos) {
				$this->semStack[$pos - 1][] = $this->semStack[$pos];
				$this->semValue = $this->semStack[$pos - 1];
			},
			90 => fn() => $this->semValue = new Node\FilterNode($this->semStack[$pos - 1], $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
			91 => fn() => $this->semValue = new Node\FilterNode($this->semStack[$pos - 1], $this->semStack[$pos], true, $this->startTokenStack[$pos - 2]->position),
			97, 99 => fn() => $this->semValue = new Expression\AssignNode($this->semStack[$pos - 2], $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
			98 => fn() => $this->semValue = new Expression\AssignNode($this->convertArrayToList($this->semStack[$pos - 2]), $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
			100 => fn() => $this->semValue = new Expression\AssignNode($this->semStack[$pos - 3], $this->semStack[$pos], true, $this->startTokenStack[$pos - 3]->position),
			103 => fn() => $this->semValue = new Expression\CloneNode($this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			104 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '+', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			105 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '-', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			106 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '*', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			107 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '/', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			108 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '.', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			109 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '%', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			110 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '&', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			111 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '|', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			112 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '^', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			113 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '<<', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			114 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '>>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			115 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '**', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			116 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '??', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			117 => fn() => $this->semValue = new Expression\PostOpNode($this->semStack[$pos - 1], '++', $this->startTokenStack[$pos - 1]->position),
			118 => fn() => $this->semValue = new Expression\PreOpNode($this->semStack[$pos], '++', $this->startTokenStack[$pos - 1]->position),
			119 => fn() => $this->semValue = new Expression\PostOpNode($this->semStack[$pos - 1], '--', $this->startTokenStack[$pos - 1]->position),
			120 => fn() => $this->semValue = new Expression\PreOpNode($this->semStack[$pos], '--', $this->startTokenStack[$pos - 1]->position),
			121 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '||', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			122 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '&&', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			123 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], 'or', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			124 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], 'and', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			125 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], 'xor', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			126 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '|', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			127, 128 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '&', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			129 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '^', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			130 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '.', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			131 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '+', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			132 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '-', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			133 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '*', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			134 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '/', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			135 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '%', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			136 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<<', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			137 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '>>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			138 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '**', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			139 => fn() => $this->semValue = new Expression\InNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			140 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '+', $this->startTokenStack[$pos - 1]->position),
			141 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '-', $this->startTokenStack[$pos - 1]->position),
			142 => fn() => $this->semValue = new Expression\NotNode($this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			143 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '~', $this->startTokenStack[$pos - 1]->position),
			144 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '===', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			145 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '!==', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			146 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '==', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			147 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '!=', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			148 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<=>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			149 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			150 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<=', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			151 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			152 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '>=', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			153 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '|>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			154 => fn() => $this->semValue = new Expression\InstanceofNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			157 => fn() => $this->semValue = new Expression\TernaryNode($this->semStack[$pos - 4], $this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 4]->position),
			158 => fn() => $this->semValue = new Expression\TernaryNode($this->semStack[$pos - 3], null, $this->semStack[$pos], $this->startTokenStack[$pos - 3]->position),
			159 => fn() => $this->semValue = new Expression\TernaryNode($this->semStack[$pos - 2], $this->semStack[$pos], null, $this->startTokenStack[$pos - 2]->position),
			160 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '??', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			161 => fn() => $this->semValue = new Expression\IssetNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
			162 => fn() => $this->semValue = new Expression\EmptyNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
			163 => fn() => $this->semValue = new Expression\CastNode('int', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			164 => fn() => $this->semValue = new Expression\CastNode('float', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			165 => fn() => $this->semValue = new Expression\CastNode('string', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			166 => fn() => $this->semValue = new Expression\CastNode('array', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			167 => fn() => $this->semValue = new Expression\CastNode('object', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			168 => fn() => $this->semValue = new Expression\CastNode('bool', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			169 => fn() => $this->semValue = new Expression\ErrorSuppressNode($this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
			171 => fn() => $this->semValue = new Expression\ClosureNode((bool) $this->semStack[$pos - 6], $this->semStack[$pos - 4], [], $this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 7]->position),
			172 => fn() => $this->semValue = new Expression\ClosureNode((bool) $this->semStack[$pos - 10], $this->semStack[$pos - 8], $this->semStack[$pos - 6], $this->semStack[$pos - 5], $this->semStack[$pos - 2], $this->startTokenStack[$pos - 11]->position),
			173 => fn() => $this->semValue = new Expression\ClosureNode((bool) $this->semStack[$pos - 7], $this->semStack[$pos - 5], $this->semStack[$pos - 3], $this->semStack[$pos - 2], null, $this->startTokenStack[$pos - 8]->position),
			174 => fn() => $this->semValue = new Expression\NewNode($this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			175 => fn() => $this->semValue = new Expression\NewNode($this->semStack[$pos], [], $this->startTokenStack[$pos - 1]->position),
			183 => fn() => $this->semValue = new Node\ClosureUseNode($this->semStack[$pos], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 1]->position),
			184, 186 => fn() => $this->semValue = $this->checkFunctionName(new Expression\FunctionCallNode($this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position)),
			185, 187 => fn() => $this->semValue = $this->checkFunctionName(new Expression\FunctionCallableNode($this->semStack[$pos - 3], $this->startTokenStack[$pos - 3]->position)),
			188 => fn() => $this->semValue = new Expression\StaticMethodCallNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 3]->position),
			189 => fn() => $this->semValue = new Expression\StaticMethodCallableNode($this->semStack[$pos - 5], $this->semStack[$pos - 3], $this->startTokenStack[$pos - 5]->position),
			191, 194 => fn() => $this->semValue = new Node\NameNode($this->semStack[$pos], Node\NameNode::KindNormal, $this->startTokenStack[$pos]->position),
			193 => fn() => $this->semValue = new Node\NameNode($this->semStack[$pos], -1, $this->startTokenStack[$pos]->position),
			195 => fn() => $this->semValue = new Node\NameNode($this->semStack[$pos], Node\NameNode::KindFullyQualified, $this->startTokenStack[$pos]->position),
			203 => fn() => $this->semValue = new Expression\ConstantFetchNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			204 => fn() => $this->semValue = new Expression\ClassConstantFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			205 => fn() => $this->semValue = new Expression\ClassConstantFetchNode($this->semStack[$pos - 4], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 4]->position),
			206 => fn() => $this->semValue = new Expression\ArrayNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 2]->position),
			207 => fn() => $this->semValue = new Expression\ArrayNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
			208 => function () use ($pos) {
				$this->semValue = $this->semStack[$pos];
				$this->shortArrays->offsetSet($this->semValue);
			},
			209 => fn() => $this->semValue = Scalar\StringNode::parse($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			210 => fn() => $this->semValue = Scalar\InterpolatedStringNode::parse($this->semStack[$pos - 1], $this->startTokenStack[$pos - 2]->position),
			211 => fn() => $this->semValue = Scalar\IntegerNode::parse($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			212 => fn() => $this->semValue = Scalar\FloatNode::parse($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			214, 297 => fn() => $this->semValue = new Scalar\StringNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			215 => fn() => $this->semValue = new Scalar\BooleanNode(true, $this->startTokenStack[$pos]->position),
			216 => fn() => $this->semValue = new Scalar\BooleanNode(false, $this->startTokenStack[$pos]->position),
			217 => fn() => $this->semValue = new Scalar\NullNode($this->startTokenStack[$pos]->position),
			220 => fn() => $this->semValue = $this->parseDocString($this->semStack[$pos - 2], [$this->semStack[$pos - 1]], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position, $this->startTokenStack[$pos]->position),
			221 => fn() => $this->semValue = $this->parseDocString($this->semStack[$pos - 1], [], $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position, $this->startTokenStack[$pos]->position),
			222 => fn() => $this->semValue = $this->parseDocString($this->semStack[$pos - 2], $this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position, $this->startTokenStack[$pos]->position),
			232 => fn() => $this->semValue = new Expression\ConstantFetchNode(new Node\NameNode($this->semStack[$pos], Node\NameNode::KindNormal, $this->startTokenStack[$pos]->position), $this->startTokenStack[$pos]->position),
			238, 254, 289 => fn() => $this->semValue = new Expression\ArrayAccessNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
			240 => fn() => $this->semValue = new Expression\MethodCallNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->semStack[$pos], false, $this->startTokenStack[$pos - 3]->position),
			241 => fn() => $this->semValue = new Expression\MethodCallableNode($this->semStack[$pos - 5], $this->semStack[$pos - 3], $this->startTokenStack[$pos - 5]->position),
			242 => fn() => $this->semValue = new Expression\MethodCallNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->semStack[$pos], true, $this->startTokenStack[$pos - 3]->position),
			243 => function () use ($pos) {
				$this->semValue = new Expression\MethodCallNode(new Expression\BinaryOpNode($this->semStack[$pos - 3], '??', new Scalar\NullNode($this->startTokenStack[$pos - 3]->position), $this->startTokenStack[$pos - 3]->position), $this->semStack[$pos - 1], $this->semStack[$pos], true, $this->startTokenStack[$pos - 3]->position);
				trigger_error('Latte: undefined-nullsafe operator ??-> is deprecated, used ' . $this->startTokenStack[$pos - 3]->position);
			},
			246, 255, 290 => fn() => $this->semValue = new Expression\PropertyFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
			247, 256, 291 => fn() => $this->semValue = new Expression\PropertyFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], true, $this->startTokenStack[$pos - 2]->position),
			248, 257, 292 => function () use ($pos) {
				$this->semValue = new Expression\PropertyFetchNode(new Expression\BinaryOpNode($this->semStack[$pos - 2], '??', new Scalar\NullNode($this->startTokenStack[$pos - 2]->position), $this->startTokenStack[$pos - 2]->position), $this->semStack[$pos], true, $this->startTokenStack[$pos - 2]->position);
				trigger_error('Latte: undefined-nullsafe operator ??-> is deprecated, used ' . $this->startTokenStack[$pos - 2]->position);
			},
			250 => fn() => $this->semValue = new Expression\VariableNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
			251 => function () use ($pos) {
				$var = $this->semStack[$pos]->name;
				$this->semValue = is_string($var)
					? new Node\VarLikeIdentifierNode($var, $this->startTokenStack[$pos]->position)
					: $var;
			},
			252, 258, 259 => fn() => $this->semValue = new Expression\StaticPropertyFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
			266 => fn() => $this->semValue = $this->convertArrayToList(new Expression\ArrayNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position)),
			267 => function () use ($pos) {
				$this->semValue = $this->semStack[$pos];
				$end = count($this->semValue) - 1;
				if (
					$this->semValue[$end]->value instanceof Expression\TemporaryNode
					&& !$this->semValue[$end]->value->value
				) {
					array_pop($this->semValue);
				}
			},
			271 => fn() => $this->semValue = new Node\ArrayItemNode(new Expression\TemporaryNode($this->semStack[$pos], $this->startTokenStack[$pos]->position), null, false, false, $this->startTokenStack[$pos]->position),
			272 => fn() => $this->semValue = new Node\ArrayItemNode(new Expression\TemporaryNode($this->semStack[$pos], $this->startTokenStack[$pos - 2]->position), $this->semStack[$pos - 2], false, false, $this->startTokenStack[$pos - 2]->position),
			273 => fn() => $this->semValue = new Node\ArrayItemNode(new Expression\TemporaryNode(null), null, false, false, $this->startTokenStack[$pos]->position),
			274 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], null, false, false, $this->startTokenStack[$pos]->position),
			275 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], null, true, false, $this->startTokenStack[$pos - 1]->position),
			276, 278 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], $this->semStack[$pos - 2], false, false, $this->startTokenStack[$pos - 2]->position),
			277, 279 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], $this->semStack[$pos - 3], true, false, $this->startTokenStack[$pos - 3]->position),
			280, 281 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], null, false, true, $this->startTokenStack[$pos - 1]->position),
			285 => fn() => $this->semValue = [$this->semStack[$pos - 1], $this->semStack[$pos]],
			286 => fn() => $this->semValue = new Node\InterpolatedStringPartNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			287 => fn() => $this->semValue = new Expression\VariableNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			293, 294 => fn() => $this->semValue = new Expression\VariableNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 2]->position),
			295 => fn() => $this->semValue = new Expression\ArrayAccessNode($this->semStack[$pos - 4], $this->semStack[$pos - 2], $this->startTokenStack[$pos - 5]->position),
			298 => fn() => $this->semValue = TagParser::parseOffset($this->semStack[$pos], $this->startTokenStack[$pos]->position),
			299 => fn() => $this->semValue = TagParser::parseOffset('-' . $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
		})();
	}
}
